-- 数据准备
/*
  A给B转账100元 事务(包含的SQL必须要全部执行成功,事务才算成功!)
   ①A账户减去100元 一条SQL
   ②B账户增加100元 一条SQL
  如果事务失败!则直接回归到事务开始之前的状态
  MYSQL中,默认每一条SQL都是一个事务
 */
#创建用户表user
CREATE TABLE user
(
    id    INT PRIMARY KEY AUTO_INCREMENT,
    name  VARCHAR(50),
    money DOUBLE
) CHARSET UTF8;

INSERT INTO user
VALUES (null, 'A', 500);

INSERT INTO user
VALUES (null, 'B', 500);
-- ①测试事务的提交
-- 开启事务(接下来执行的SQL语句都是属于一个事务中的)
-- 事务进行中对数据的操作都是在虚拟表中进行的
BEGIN;

-- A给B转账100元
-- A账户减去100元
UPDATE user
SET money = money - 100
WHERE name = 'A';

-- B账户增加100元
UPDATE user
SET money = money + 100
WHERE name = 'B';

-- 转账无误,所以把事务提交,让虚拟表中的数据持久化到数据库中
COMMIT;

-- 测试事务的回滚
-- 开启事务
BEGIN;

-- A给B转账100元
-- A账户减去100元
UPDATE user
SET money = money - 100
WHERE name = 'A';

-- B账户增加100元时,发生了故障,导致增加了1000元
UPDATE user
SET money = money + 1000
WHERE name = 'B';

-- 由于事务执行过程中,发生了问题,所以不能让事务操作的数据持久化,所以需要进行回滚操作
-- 直接将虚拟表的数据销毁即可
ROLLBACK;

SELECT *
FROM user;